package conexao;

import java.util.Vector;

import org.ksoap.SoapObject;
import org.ksoap.transport.HttpTransport;
import model.Base;
import model.BaseGasto;
import model.BasePeriodo;
import model.BaseUsuario;
import entidades.Gasto;
import entidades.Periodo;
import entidades.Usuario;




public class WebServicePHP {

	private final String URL = "http://localhost:80/webservice_SCGP/webServiceSCGP.php";
	//private final String URL = "http://hugoiguana.coolpage.biz/webservice_SCGP/webServiceSCGP.php";
	private final String CODIGO_WEBSERVICE = "19287bhcby";
	
	private final char SEPARADOR_REGISTROS = '#';
	private final char SEPARADOR_VARIAVEIS = '|';
	
	
	private final String FUNCAO_SEND_BACKUP_USUARIO = "sendBackupUsuario";
	private final String FUNCAO_SEND_BACKUP_GASTO   = "sendBackupGasto";
	private final String FUNCAO_SEND_BACKUP_PERIODO = "sendBackupPeriodo";
	
	private final String FUNCAO_GET_BACKUP_USUARIO = "getBackupUsuario";
	private final String FUNCAO_GET_BACKUP_GASTO   = "getBackupGasto";
	private final String FUNCAO_GET_BACKUP_PERIODO = "getBackupPeriodo";
	
	
	public static final int USUARIO = 1;
	public static final int GASTO   = 2;
	public static final int PERIODO = 3;
	
	
	
	public boolean sendBackup(String senha){
		
		boolean sucesso = false;
		
		if (senha.equals(Usuario.usuario.getSenha())) {

			if (this.sendBackupEntiade(WebServicePHP.USUARIO)) {
				if (this.sendBackupEntiade(WebServicePHP.GASTO)) {
					if (this.sendBackupEntiade(WebServicePHP.PERIODO)) {
						sucesso = true;
					}
				}
			}
		}

		return sucesso;
	}
	
	
	
	public boolean getBackupAndSaveInPhone(String senha){
		
		boolean sucesso = false;
		
			// Limpando a memoria do servidor.
			Base.deleteRecordStore(BaseUsuario.BASE_DADOS_USUARIO);
			Base.deleteRecordStore(BaseGasto.BASE_DADOS_GASTO);
			Base.deleteRecordStore(BasePeriodo.BASE_DADOS_PERIODO);

			if (this.getAndSaveInPhoneBackupEntiade(WebServicePHP.USUARIO)) {
				if (this.getAndSaveInPhoneBackupEntiade(WebServicePHP.GASTO)) {
					if (this.getAndSaveInPhoneBackupEntiade(WebServicePHP.PERIODO)) {
						sucesso = true;
					}
				}
			}
			
		return sucesso;
	}
		
	
	private boolean sendBackupEntiade(int entidade){
		
		Vector colecaoEntidade = new Vector();
		String servicoWebService = "";
		
		switch (entidade) {
		case USUARIO:
			colecaoEntidade = BaseUsuario.findAllUsuarios();
			servicoWebService = FUNCAO_SEND_BACKUP_USUARIO;
			break;
        case GASTO:
        	colecaoEntidade = BaseGasto.findAllGastos();
        	servicoWebService = FUNCAO_SEND_BACKUP_GASTO;
			break;
        case PERIODO:
        	colecaoEntidade = BasePeriodo.findAllPeriodos();
        	servicoWebService = FUNCAO_SEND_BACKUP_PERIODO;
			break;
		default:
			break;
		}
		
		String dadosFormatados = this.formatarDadosToSendBackup(colecaoEntidade);		
		boolean sucesso = this.sendBackupToWebServer(dadosFormatados,servicoWebService);
		
		return sucesso;
	}
	
	
	
	/* 
	 *  Funcao responsavel por enviar os dados para o webService PHP.
	 * 
	 * */
	private boolean sendBackupToWebServer(String dadosFormatados, String servicoWebService){
		
		boolean sucesso = false;

		try {

			SoapObject client = new SoapObject(URL, servicoWebService);
			client.addProperty("dados", dadosFormatados);
			client.addProperty("codigoacesso", CODIGO_WEBSERVICE);

			HttpTransport ht = new HttpTransport(URL, servicoWebService);

			String retornoDados = (String) ht.call(client);

			if (retornoDados.equalsIgnoreCase("TRUE"))
				sucesso = true;
			
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		
      return sucesso;		
	}
	
	
	
	
	private String getBackupWebServer(String servicoWebService){
		
		try{
			
		// chama o servico do WebService.
		SoapObject client = new SoapObject(URL,servicoWebService);
		client.addProperty("codigoAcesso", CODIGO_WEBSERVICE);
		HttpTransport ht = new HttpTransport(URL,servicoWebService);
		
		 String retornoDados = (String)ht.call(client);
		
		if(retornoDados.equalsIgnoreCase("semacesso"))
		return null;
		
		return retornoDados;
		}
		catch(Exception e){
			e.printStackTrace();
			return null;
		}
		
	}
	
	
	/* 
	 *  Funcao responsavel por formatar os dados para serem enviados ao webService PHP.
	 * 
	 * */
	private String formatarDadosToSendBackup(Vector colecaoValores){
		
		StringBuffer dadosFormatados = new StringBuffer(); 
		
		for(int i = 0 ; i < colecaoValores.size() ; i++){
			
			if(colecaoValores.elementAt(i) instanceof Usuario){
				
				Usuario u = (Usuario) colecaoValores.elementAt(i);
				
				dadosFormatados.append(u.getId());
				dadosFormatados.append(SEPARADOR_VARIAVEIS);
				dadosFormatados.append(u.getNome());
				dadosFormatados.append(SEPARADOR_VARIAVEIS);
				dadosFormatados.append(u.getDiaRecebimento());
				dadosFormatados.append(SEPARADOR_VARIAVEIS);
				dadosFormatados.append(u.getSalario());
				dadosFormatados.append(SEPARADOR_VARIAVEIS);
				dadosFormatados.append(u.getValorSobra());
				dadosFormatados.append(SEPARADOR_VARIAVEIS);
				dadosFormatados.append(u.getSenha());
			}
			else if(colecaoValores.elementAt(i) instanceof Gasto){
				
				Gasto g = (Gasto) colecaoValores.elementAt(i);
				
				if(i != 0)
					dadosFormatados.append(SEPARADOR_REGISTROS);
				
				dadosFormatados.append(g.getId());
				dadosFormatados.append(SEPARADOR_VARIAVEIS);
				dadosFormatados.append(g.getNome());
				dadosFormatados.append(SEPARADOR_VARIAVEIS);
				dadosFormatados.append(g.getValor());
				dadosFormatados.append(SEPARADOR_VARIAVEIS);
				dadosFormatados.append(g.getAno());
				dadosFormatados.append(SEPARADOR_VARIAVEIS);
				dadosFormatados.append(g.getMes());
				dadosFormatados.append(SEPARADOR_VARIAVEIS);
				dadosFormatados.append(g.getTipo());
				dadosFormatados.append(SEPARADOR_VARIAVEIS);
				dadosFormatados.append(g.getDescricao());
				dadosFormatados.append(SEPARADOR_VARIAVEIS);
				dadosFormatados.append(g.getDataCadastro());
			}
			else if(colecaoValores.elementAt(i) instanceof Periodo){
				
				Periodo p = (Periodo) colecaoValores.elementAt(i);
				
				if(i != 0)
					dadosFormatados.append(SEPARADOR_REGISTROS);
				
				dadosFormatados.append(p.getId());
				dadosFormatados.append(SEPARADOR_VARIAVEIS);
				dadosFormatados.append(p.getAno());
				dadosFormatados.append(SEPARADOR_VARIAVEIS);
				dadosFormatados.append(p.getMes());
			}
		}
		
		return dadosFormatados.toString();
	}
	

	
	
	
	private boolean getAndSaveInPhoneBackupEntiade(int entidade){
			
			Vector colecaoEntidade = new Vector();
			String dadosFormatados = "";
			boolean sucesso = false;
			
			switch (entidade) {
			
			case USUARIO:
				dadosFormatados = this.getBackupWebServer(FUNCAO_GET_BACKUP_USUARIO);
				if(dadosFormatados == null || dadosFormatados.equals(""))
					return false;
				        colecaoEntidade = this.getColecaoUsuariosToSaveInPhone(dadosFormatados);
				        sucesso = BaseUsuario.cadastrarUsuarioResgatadoWebService(colecaoEntidade);
				break;
				
	        case GASTO:
	        	dadosFormatados = this.getBackupWebServer(FUNCAO_GET_BACKUP_GASTO);
	        	if(dadosFormatados == null || dadosFormatados.equals(""))
					return false;
	        	colecaoEntidade = this.getColecaoGastosToSaveInPhone(dadosFormatados);
	        	sucesso = BaseGasto.cadastrarGastosResgatadosWebService(colecaoEntidade);
				break;
				
	        case PERIODO:
	        	dadosFormatados = this.getBackupWebServer(FUNCAO_GET_BACKUP_PERIODO);
	        	if(dadosFormatados == null || dadosFormatados.equals(""))
					return false;
	        	colecaoEntidade = this.getColecaoPeriodosToSaveInPhone(dadosFormatados);
	        	sucesso = BasePeriodo.cadastrarPeriodosResgatadosWebService(colecaoEntidade);
				break;
				
			default:
				break;
			}
			
	  return sucesso;
	}
	
	
	
	
	
	private Vector getColecaoUsuariosToSaveInPhone(String dadosFormatados){
		
		Vector colecaoUsuarios = new Vector();
		
		try{
		
		Vector colecaoDadosUsuario = this.desformataDadosEtidade(dadosFormatados);
		
		
		for(int j = 0 ; j < colecaoDadosUsuario.size() ; j++ ){
		
		String entrada = (String) colecaoDadosUsuario.elementAt(j);
		char [] caracteres = new char[entrada.length()];
		caracteres = entrada.toCharArray();
		
		String [] arrayVariaveis = new String[6];
		StringBuffer valor = new StringBuffer();

		int e = 0;
		for(int i  = 0 ; i < caracteres.length ; i++){
			if(caracteres[i] != SEPARADOR_VARIAVEIS)
				valor.append(caracteres[i]);
			else if(caracteres[i] == SEPARADOR_VARIAVEIS){
				arrayVariaveis[e] = valor.toString(); 
				valor = new StringBuffer();
				++e;
			}
			if(i == caracteres.length - 1)
				arrayVariaveis[e] = valor.toString();
		}
		
		Usuario usuario = new Usuario();
		
		usuario.setId(Integer.parseInt(arrayVariaveis[0]));
		usuario.setNome(arrayVariaveis[1]);
		usuario.setDiaRecebimento(arrayVariaveis[2]);
		usuario.setSalario(arrayVariaveis[3]);
		usuario.setValorSobra(arrayVariaveis[4]);
		usuario.setSenha(arrayVariaveis[5]);
		
		colecaoUsuarios.addElement(usuario);
		}
		
		}
		catch(Exception e){
			e.printStackTrace();
			return null;
		}
		
		return colecaoUsuarios;
	}
	
	
	
	
	private Vector getColecaoGastosToSaveInPhone(String dadosFormatados){
		
    	try{
    	
		Vector colecaoGastos = new Vector();
		Vector colecaoDadosGastos = this.desformataDadosEtidade(dadosFormatados);
		
		for(int j = 0 ; j < colecaoDadosGastos.size() ; j++ ){
		
		String entrada = (String) colecaoDadosGastos.elementAt(j);
		char [] caracteres = new char[entrada.length()];
		caracteres = entrada.toCharArray();
		
		String [] arrayVariaveis = new String[8];
		StringBuffer valor = new StringBuffer();

		int e = 0;
		for(int i  = 0 ; i < caracteres.length ; i++){
			if(caracteres[i] != SEPARADOR_VARIAVEIS)
				valor.append(caracteres[i]);
			else if(caracteres[i] == SEPARADOR_VARIAVEIS){
				arrayVariaveis[e] = valor.toString(); 
				valor = new StringBuffer();
				++e;
			}
			if(i == caracteres.length - 1)
				arrayVariaveis[e] = valor.toString();
		}
		
		Gasto gasto = new Gasto();
		
		gasto.setId(Integer.parseInt(arrayVariaveis[0]));
		gasto.setNome(arrayVariaveis[1]);
		gasto.setValor(arrayVariaveis[2]);
		gasto.setAno(Integer.parseInt(arrayVariaveis[3]));
		gasto.setMes(Integer.parseInt(arrayVariaveis[4]));
		gasto.setTipo(Integer.parseInt(arrayVariaveis[5]));
		gasto.setDescricao(arrayVariaveis[6]);
		gasto.setDataCadastro(arrayVariaveis[7]);
		
		colecaoGastos.addElement(gasto);
		}
		return colecaoGastos;
    }
    catch(Exception e){
    	e.printStackTrace();
    	return null;
    } 
	}

    
	
	
	private Vector getColecaoPeriodosToSaveInPhone(String dadosFormatados){
		
    	try{
    	
		Vector colecaoPeriodos = new Vector();
		Vector colecaoDadosPeriodos = this.desformataDadosEtidade(dadosFormatados);
		
		for(int j = 0 ; j < colecaoDadosPeriodos.size() ; j++ ){
		
		String entrada = (String) colecaoDadosPeriodos.elementAt(j);
		char [] caracteres = new char[entrada.length()];
		caracteres = entrada.toCharArray();
		
		String [] arrayVariaveis = new String[3];
		StringBuffer valor = new StringBuffer();

		int e = 0;
		for(int i  = 0 ; i < caracteres.length ; i++){
			if(caracteres[i] != SEPARADOR_VARIAVEIS)
				valor.append(caracteres[i]);
			else if(caracteres[i] == SEPARADOR_VARIAVEIS){
				arrayVariaveis[e] = valor.toString(); 
				valor = new StringBuffer();
				++e;
			}
			if(i == caracteres.length - 1)
				arrayVariaveis[e] = valor.toString();
		}
		
		Periodo periodo = new Periodo();
		
		periodo.setId(Integer.parseInt(arrayVariaveis[0]));
		periodo.setAno(Integer.parseInt(arrayVariaveis[1]));
		periodo.setMes(Integer.parseInt(arrayVariaveis[2]));
		
		colecaoPeriodos.addElement(periodo);
		}
		return colecaoPeriodos;
    }
    catch(Exception e){
    	e.printStackTrace();
    	return null;
    } 
	}
	
	
	
	
	private Vector desformataDadosEtidade(String dadosFormatados)
			throws Exception {
		
      Vector colecaoDados = new Vector();
		
		char [] caracteres = new char[dadosFormatados.length()];
		caracteres = dadosFormatados.toCharArray();
		StringBuffer valor = new StringBuffer();

		for(int i  = 0 ; i < caracteres.length ; i++){
			if(caracteres[i] != SEPARADOR_REGISTROS)
				valor.append(caracteres[i]);
			else if(caracteres[i] == SEPARADOR_REGISTROS){
				colecaoDados.addElement(valor.toString());
				valor = new StringBuffer();
			}
			if(i == caracteres.length - 1)
				colecaoDados.addElement(valor.toString());
	}
		
		return colecaoDados;
	}
	
	
}// fim da classe.
